/**
 * CategoriasPanel.java
 * @author Paulo Chang, Carnet 11076
 * @author Oscar Castañeda, Carnet 11086
 * @author Francisco Martínez, Carnet 11096
 * @since 05/11/2011
 * Modificado por última vez el 06/11/2011
 * Descripción: Panel en el cual se muestran las tablas de todas las categorías 
 * existentes en el programa.
 */


import java.util.ArrayList;
import javax.swing.JTabbedPane;


public class CategoriasPanel extends JTabbedPane{
    
    private ConexionBD baseDatos;
    private ControlCategoria categoriasHechas;
    private Opciones buscador;
    private StringEncrypter encriptador;
    
    /**
     * Permite crear un nuevo panel de categorías, inicializando todos sus componentes.
     * @param connection ConexionBD que permite interactuar con la base de datos.
     * @param usuario String con el nombre de usuario que se encuentra usando el programa.
     * @param categoriasExistentes ControlCategoría que permite llevar un control sobre las categorías existentes.
     * @param primeraCreacion boolean que indica si esta es la primera vez que se abre el programa con el usuario (true) o no (false)
     * @param encriptador StringEncrypter que permite encriptar y desencriptar los datos.
     */
    public CategoriasPanel (ConexionBD connection, String usuario, ControlCategoria categoriasExistentes, boolean primeraCreacion, StringEncrypter encriptador){
            //Crear la conexion           
            baseDatos = connection;
            this.encriptador=encriptador;
            categoriasHechas = categoriasExistentes;
            //Cargar las Categorías
            Categoria internet = new Categoria(baseDatos, "Internet","id","Titulo","Link", "Usuario", "Contraseña");
            Tabla tablaInternet = new Tabla(baseDatos,internet, encriptador);
            addTab("Aplicaciones de Internet", tablaInternet);           
            Categoria dispositivos = new Categoria(baseDatos, "Dispositivos","id","Titulo","Contraseña" );
            Tabla tablaDispositivos = new Tabla(baseDatos,dispositivos, encriptador);
            addTab("Dispositivos Electrónicos", tablaDispositivos);
            Categoria membresias = new Categoria(baseDatos, "Membresias","id","Titulo","Usuario","Contraseña","Fecha Adquisicion", "Fecha Vencimiento");
            Tabla tablaMembresias = new Tabla(baseDatos,membresias, encriptador);
            addTab("Membresías de servicios por Internet", tablaMembresias);
            Categoria licencias=new Categoria(baseDatos, "Licencias", "id", "Titulo","Licencia", "Fecha Compra", "Fecha Expiracion","Link", "Usuario", "Contraseña");
            Tabla tablaLicencias = new Tabla(baseDatos,licencias, encriptador);
            addTab("Licencia de Productos Informáticos", tablaLicencias);
            
            //Si es la primera vez que se ejecuta el programa, se agregan las categorías
            //predifinidas a la lista de categorías existentes.
            if (primeraCreacion){
                categoriasHechas.agregarCategoria(internet);
                categoriasHechas.agregarCategoria(dispositivos);
                categoriasHechas.agregarCategoria(membresias);
                categoriasHechas.agregarCategoria(licencias);
            }
            ArrayList<Tabla> listaTablas = new ArrayList();
            listaTablas.add(tablaInternet);
            listaTablas.add(tablaDispositivos);
            listaTablas.add(tablaMembresias);
            listaTablas.add(tablaLicencias);
            
            //Se crea la categoría y tabla de las categorías adicionales. Además, se añaden a las listas
            //de categorías y tablas existentes.
            for(int i=4; i<categoriasHechas.getListaCategorias().size();i++){
                Categoria categoria=new Categoria(baseDatos, categoriasHechas.getListaCategorias().get(i),"id");
                Tabla nuevaTabla = new Tabla(baseDatos, categoria, encriptador);
                addTab(categoria.getTituloBD(), nuevaTabla);
                listaTablas.add(nuevaTabla);
            }
            
            //Se crea un nuevo panel de opciones que contiene las tablas existentes en el programa.
            buscador = new Opciones(listaTablas);
    }
    
    /**
     * Permite reiniciar el panel de categorías, dejando únicamente las cuatro categorías predifinidas.
     */
    public void reiniciar(){
        Categoria internet = new Categoria(baseDatos, "Internet","id","Titulo","Link", "Usuario", "Contraseña");
        Tabla tablaInternet = new Tabla(baseDatos,internet, encriptador);
        addTab("Aplicaciones de Internet", tablaInternet);           
        Categoria dispositivos = new Categoria(baseDatos, "Dispositivos","id","Titulo","Contraseña" );
        Tabla tablaDispositivos = new Tabla(baseDatos,dispositivos, encriptador);
        addTab("Dispositivos Electrónicos", tablaDispositivos);
        Categoria membresias = new Categoria(baseDatos, "Membresias","id","Titulo","Usuario","Contraseña","Fecha Adquisicion", "Fecha Vencimiento");
        Tabla tablaMembresias = new Tabla(baseDatos,membresias, encriptador);
        addTab("Membresías de servicios por Internet", tablaMembresias);
        Categoria licencias=new Categoria(baseDatos, "Licencias", "id", "Titulo","Licencia", "Fecha Compra", "Fecha Expiracion","Link", "Usuario", "Contraseña");
        Tabla tablaLicencias = new Tabla(baseDatos,licencias, encriptador);
        addTab("Licencia de Productos Informáticos", tablaLicencias);
        categoriasHechas.agregarCategoria(internet);
        categoriasHechas.agregarCategoria(dispositivos);
        categoriasHechas.agregarCategoria(membresias);
        categoriasHechas.agregarCategoria(licencias);
        buscador.agregarTabla(tablaInternet);
        buscador.agregarTabla(tablaDispositivos);
        buscador.agregarTabla(tablaMembresias);
        buscador.agregarTabla(tablaLicencias);
    }
   
    /**
     * Devuele el atributo buscador, que es del tipo Opciones.
     * @return Opciones que permiten llevar un control de las tablas existentes, así
     * como realizar búsquedas en ellas.
     */
    public Opciones getOpciones(){
        return buscador;
    }
    
    /**
     * Devuelve que se está utilizando en la actual ejecución del programa
     * @return StringEncrypter que permite encriptar y desencriptar los datos del programa.
     */
    public StringEncrypter getEncriptador(){
        return encriptador;
    }
        
}